    package com.demo.generics.demo1.domain;

    import java.util.ArrayList;

    class Child extends Pair<Integer> {

        public Child(Integer first, Integer last) {
            super(first, last);
        }
    }

    class PairHelper {
        static int add(Pair<Number> p) {
            Number first = p.getFirst();
            Number last = p.getLast();
            return first.intValue() + last.intValue();
        }

        public static void main(String[] args) {
    //        int n = PairHelper.add(new Pair<Integer>(123, 456));//无法编译 因为方法参数指定的是Pair<Number>
            // 入参必须是Pair<Number> 泛型
            // 不能将ArrayList<Integer>向上转型为ArrayList<Number>
            // 但是ArrayList<Number>引用可以接收ArrayList<Integer>实例，实际的类型参数的具体类型可以是申请的类型参数类型的子类。
            int sum = PairHelper.add(new Pair<Number>(1,2));
            System.out.println(sum);

            ArrayList<Integer> a = new ArrayList<>();
            ArrayList<Number> b = new ArrayList<>();
            b.add(1);
    //        b = a;
    //        ArrayList<Number> c = (ArrayList<Number>)a; 泛型无法向上转型，无继承关系
        }
    }

    public class Pair<T> {
        private T first;
        private T last;
        public Pair(T first, T last) {
            this.first = first;
            this.last = last;
        }
        public T getFirst() {return first;}
        public T getLast() {return last;}

        public void setFirst(T first) {
            this.first = first;
        }
        public void setLast(T last) {
            this.last = last;
        }

        // 静态泛型方法应该使用其他类型区分:
        public static <K> Pair<K> create(K first, K last) {
            return new Pair<K>(first, last);
        }

        // 这种方法怎么看？有人说static后的<T>和Pair<T>类型的<T>已经没有任何关系了
        public static <T> Pair<T> create1(T first, T last) {
            return new Pair<T>(first, last);
        }
    }
